home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Graphics / sKulpt / skulpt-src / win-src / Objects-D3D.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-02  |  3.6 KB  |  160 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11.  
  12. // Includes D3D
  13. #define  D3D_OVERLOADS
  14. #include <ddraw.h>
  15. #include <d3d.h>
  16.  
  17. // Includes utilitaires D3D
  18. #include "d3dmath.h"
  19. #include "d3dutil.h"
  20. #include "D3DEnum.h"
  21. #include <d3dx.h>
  22.  
  23. // Ids Resources
  24. #include "resource.h"
  25.  
  26. // Constantes
  27. #include "const.h"
  28.  
  29. // Types
  30. #include "types.h"
  31.  
  32. // Variables globales projet
  33. #include "vars.h"
  34.  
  35. // Prototypes fonctions autres modules
  36. #include "proto.h"
  37.  
  38. // Macros
  39. #include "macros.h"
  40.  
  41. //************************************* C O M M U N S ***********************
  42. void vDeleteD3DObjects(void)
  43. {
  44.     // RAZ Objets D3D
  45.     for (int iObject = 0 ; iObject < XDC_NUMOBJECTS ; iObject++)
  46.     {
  47.         if (!Objects[iObject].bEnabled) continue;
  48.         
  49.         Objects[iObject].pShape -> Release();
  50.         Objects[iObject].bEnabled = FALSE;
  51.         Objects[iObject].bHidden = FALSE;
  52.     }
  53.     iObjtFirstAvailable = 0;
  54.     iObjtLastUsed = -1;
  55. }
  56.  
  57. int iMakeD3DObj(void)
  58. {
  59.     int iCnt;
  60.  
  61.     // Rechercher un slot libre
  62.     for (iCnt = iObjtFirstAvailable ; (iCnt <= iObjtLastUsed) && (Objects [iCnt].bEnabled == TRUE) ; iCnt++);
  63.  
  64.     // Si pas trouvé alors fail
  65.     if (iCnt >= XDC_NUMOBJECTS)
  66.     {
  67.         vTrace("*** E0023 : Plus de slots objets libres");
  68.         return -1;
  69.     }
  70.  
  71.     // Créer l'objet
  72.     Objects[iCnt].vOrigin = D3DVECTOR(0.f, 0.f, 0.f);
  73.     Objects[iCnt].bEnabled = TRUE;
  74.     Objects[iCnt].bHidden = FALSE;
  75.     Objects[iCnt].bSelected = FALSE;
  76.  
  77.     // Affecter couleur et aspect
  78.     D3DMATERIAL7 *pMtrl = &Objects[iCnt].mtrl;
  79.     ZeroMemory(pMtrl, sizeof(D3DMATERIAL7));
  80.     pMtrl -> ambient.a = 0.5f;
  81.     pMtrl -> ambient.r = (float) 255 / 255.f / 6.f;
  82.     pMtrl -> ambient.g = (float) 125 / 255.f / 6.f;
  83.     pMtrl -> ambient.b = (float) 35 / 255.f / 6.f;
  84.  
  85.     pMtrl -> diffuse.a = 0.5f;
  86.     pMtrl -> diffuse.r = (float) 255 / 255.f;
  87.     pMtrl -> diffuse.g = (float) 125 / 255.f;
  88.     pMtrl -> diffuse.b = (float) 35 / 255.f;
  89.  
  90.     pMtrl -> specular.a = 0.5f;
  91.     pMtrl -> specular.r = 1.f;
  92.     pMtrl -> specular.g = 1.f;
  93.     pMtrl -> specular.b = 1.f;
  94.     pMtrl -> power = 1.f;
  95.  
  96.     while (Objects[iObjtFirstAvailable].bEnabled == TRUE) iObjtFirstAvailable++;
  97.     if (iObjtLastUsed < iCnt) iObjtLastUsed = iCnt;
  98.     
  99.     return iCnt;
  100. }
  101.  
  102. int iFindD3DObject(D3DVECTOR p, int iPrevious)
  103. {
  104.     int iCnt;
  105.     float fTolerance = (float) fabs(fXmax - fXmin) / XDC_ZONE;
  106.     
  107.     // Rechercher 
  108.     for (iCnt = max(iPrevious + 1, 0) ;
  109.             (iCnt <= iObjtLastUsed)
  110.          && (!(   (Objects[iCnt].bEnabled == TRUE)
  111.                && (Objects[iCnt].bHidden == FALSE)
  112.                && (fabs(Objects[iCnt].vOrigin.x - p.x) < fTolerance)
  113.                && (fabs(Objects[iCnt].vOrigin.y - p.y) < fTolerance)
  114.                && (fabs(Objects[iCnt].vOrigin.z - p.z) < fTolerance)
  115.               ))
  116.          ;
  117.          iCnt++) ;
  118.  
  119.     // Si trouvé alors renvoyer son indice
  120.     if (iCnt <= iObjtLastUsed)
  121.         return(iCnt);
  122.  
  123.     // Sinon renvoyer -1
  124.     return -1;
  125. }
  126.  
  127. BOOL bMoveD3DObj(int iObject, D3DVECTOR vPos)
  128. {
  129.     if (Objects[iObject].bEnabled == FALSE) return FALSE;
  130.  
  131.     LPDIRECT3DVERTEXBUFFER7 vBuf = Objects[iObject].pShape -> GetVB();
  132.     D3DVERTEXBUFFERDESC vbDesc;
  133.  
  134.     vbDesc.dwSize = sizeof(vbDesc);
  135.     vBuf -> GetVertexBufferDesc(&vbDesc);
  136.  
  137.     if (vbDesc.dwFVF != D3DFVF_VERTEX) return FALSE;
  138.  
  139.     D3DVERTEX *vbAddr;
  140.     unsigned long iSize;
  141.  
  142.     vBuf -> Lock(DDLOCK_SURFACEMEMORYPTR, (void **) &vbAddr, &iSize);
  143.  
  144.     for (unsigned iVertex = 0 ; iVertex < vbDesc.dwNumVertices ; iVertex++)
  145.     {
  146.         vbAddr[iVertex].x += vPos.x;
  147.         vbAddr[iVertex].y += vPos.y;
  148.         vbAddr[iVertex].z += vPos.z;
  149.     }
  150.  
  151.     vBuf -> Unlock();
  152.  
  153.     vBuf -> Release();
  154.  
  155.     Objects[iObject].vOrigin += vPos;
  156.  
  157.     return TRUE;
  158. }
  159.  
  160.